package br.edu.infnet.avaliacao.dao;

import java.util.ArrayList;
import java.util.List;

import org.apache.log4j.Logger;
import org.hibernate.Query;
import org.hibernate.Session;

import br.edu.infnet.avaliacao.dao.hibernate.Criterio;
import br.edu.infnet.avaliacao.dao.hibernate.DAO;
import br.edu.infnet.avaliacao.modelo.Usuario;

public class UsuarioHibernateDAO extends DAO<Usuario> implements UsuarioDAO {

	private static final Logger LOGGER = Logger
			.getLogger(UsuarioHibernateDAO.class);

	public UsuarioHibernateDAO() {
		super(UsuarioHibernateDAO.class);
	}

	/* (non-Javadoc)
	 * @see br.eud.infnet.dao.UsuarioDAO2#consultar(java.lang.Integer)
	 */
	@Override
	public Usuario consultar(Integer codigo) {
		return super.consultar(codigo);
	}

	/* (non-Javadoc)
	 * @see br.eud.infnet.dao.UsuarioDAO2#atualizar(br.edu.infnet.modelo.Usuario)
	 */
	@Override
	public void atualizar(Usuario usuario) {
		super.atualizar(usuario);
	}

	/* (non-Javadoc)
	 * @see br.eud.infnet.dao.UsuarioDAO2#inserir(br.edu.infnet.modelo.Usuario)
	 */
	@Override
	public void inserir(Usuario usuario) {
		super.incluir(usuario);
	}

	/* (non-Javadoc)
	 * @see br.eud.infnet.dao.UsuarioDAO2#excluir(br.edu.infnet.modelo.Usuario)
	 */
	@Override
	public void excluir(Usuario usuario) {
		super.deletar(usuario);
	}

	/* (non-Javadoc)
	 * @see br.eud.infnet.dao.UsuarioDAO2#excluir(java.lang.Integer)
	 */
	@Override
	public void excluir(Integer codigo) {
		super.deletar(new Usuario(codigo));
	}

	/* (non-Javadoc)
	 * @see br.eud.infnet.dao.UsuarioDAO2#consultar(br.eud.infnet.dao.hibernate.Criterio)
	 */
	@Override
	public Usuario consultar(Criterio criterio) {
		Usuario usuario = new Usuario();
		try {
			usuario = (Usuario) listar(criterio).get(0);
		} catch (Exception e) {
			LOGGER.error(e);
		}
		return usuario;
	}

	/* (non-Javadoc)
	 * @see br.eud.infnet.dao.UsuarioDAO2#consultarPorNome(java.lang.String)
	 */
	@Override
	public Usuario consultarPorNome(String nome) {
		Session session = getSession();

		try {
			return consultarPorNome(session, nome);
		} catch (Exception e) {
			LOGGER.error(e);
			return null;
		} finally {
			session.close();
		}
	}

	/* (non-Javadoc)
	 * @see br.eud.infnet.dao.UsuarioDAO2#existe(java.lang.Integer)
	 */
	@Override
	public boolean existe(Integer id) {
		Usuario u = consultar(id);
		return (u != null);
	}

	/* (non-Javadoc)
	 * @see br.eud.infnet.dao.UsuarioDAO2#validarLogin(br.edu.infnet.modelo.Usuario)
	 */
	@SuppressWarnings("unchecked")
	@Override
	public boolean validarLogin(Usuario usuario) {

		List<Usuario> lista = new ArrayList<Usuario>();
		try {
			String sql = "from Usuario where lower(login) = ?";

			Criterio criterio = new Criterio();

			Query query = session.createQuery(sql);
			query.setString(0, usuario.getLogin().toLowerCase());
			query.setFirstResult(criterio.getRegistroInicial());
			query.setMaxResults(criterio.getTamanhoPagina());
			lista = (List<Usuario>) query.list();

		} catch (Exception e) {
			LOGGER.error(e);
		}

		return lista.isEmpty();
	}

	/* (non-Javadoc)
	 * @see br.eud.infnet.dao.UsuarioDAO2#consultarPorNome(org.hibernate.Session, java.lang.String)
	 */
	@Override
	@SuppressWarnings("unchecked")
	public Usuario consultarPorNome(Session session, String nome) {

		if (nome == null) {
			return null;
		}

		List<Usuario> lista = new ArrayList<Usuario>();
		try {
			String sql = "from Usuario where lower(nome) = ?";

			Criterio criterio = new Criterio();

			Query query = session.createQuery(sql);
			query.setString(0, nome.toLowerCase());
			query.setFirstResult(criterio.getRegistroInicial());
			query.setMaxResults(criterio.getTamanhoPagina());
			lista = (List<Usuario>) query.list();

		} catch (Exception e) {
			LOGGER.error(e);
		}

		if (lista.isEmpty()) {
			return null;
		} else {
			return lista.get(0);
		}
	}

	/* (non-Javadoc)
	 * @see br.eud.infnet.dao.UsuarioDAO2#listar()
	 */
	@Override
	public List<Usuario> listar() {
		Criterio c = new Criterio();
		c.setTotalRegistros(MAXIMO_REGISTROS);
		c.setTamanhoPagina(MAXIMO_REGISTROS);
		c.setRegistroInicial(1);
		return listar(c);
	}

	/* (non-Javadoc)
	 * @see br.eud.infnet.dao.UsuarioDAO2#listar(br.eud.infnet.dao.hibernate.Criterio)
	 */
	@Override
	@SuppressWarnings("unchecked")
	public List<Usuario> listar(Criterio criterio) {

		List<Usuario> lista = new ArrayList<Usuario>();
		Session session = getSession();
		try {
			String sql = "from Usuario";

			Query query = session.createQuery(sql);
			query.setFirstResult(criterio.getRegistroInicial());
			query.setMaxResults(criterio.getTamanhoPagina());
			lista = (List<Usuario>) query.list();

		} catch (Exception e) {
			LOGGER.error(e);
		} finally {
			session.close();
		}
		return lista;
	}

}
